package com.zjl.quartz.第01章_基础的使用;

import lombok.extern.slf4j.Slf4j;
import org.quartz.*;

import java.time.LocalDateTime;

/**
 *
 * 必须是   public class   否则 反射获取到了，但是不可执行
 *
 * 首先在 Job 中定义与传递数据的时候 key 相同属性和 set 方法。
 * 这样在创建 job 的时候，会通过 setter 将参数设置进来。
 *
 * Quartz 每次在执行任务的时候，都会创建新的 Job 对象和 JobDetail 对象。
 *
 * @DisallowConcurrentExecution  防止任务并发执行
 *
 * 这里需要注意，需要给 Job 类同时添加 @DisallowConcurrentExecution 注解，让任务串行执行，否则当前任务没有执行完成，
 * 下一次任务执行的时候，通过 JobDataMap 获取到的值是没有被更新的。
 *
 *
 */
@DisallowConcurrentExecution//标记在 Job 类上，指示调度器不应在同一时刻并发执行同一个作业实例
@PersistJobDataAfterExecution//标记在 Job 类上，表示作业成功执行后，应将修改过的 JobDataMap 数据持久化保存
@Slf4j
public class C_Job implements Job {
    // 需要与传递的key名称相同
    private String name;
    // 定义set方法
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        //获取Job传递的数据
        jobExecutionContext.getJobDetail().getJobDataMap().forEach(
                (k, v) -> log.info("任务 Job, key:{}, value:{}", k, v)
        );
        //获取trigger传递的数据
        jobExecutionContext.getTrigger().getJobDataMap().forEach(
                (k, v) -> log.info("触发器 Trigger, key:{}, value:{}", k, v)
        );
        //获取 Job 和 trigger的传递参数
        //如果传递参数的时候 JobDetail 和 Trigger 传递了相同的 key 值，
        // 那么 Trigger 中传递的参数会覆盖 JobDetail 中的参数
        JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap();
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        jobDataMap.put("count",jobDataMap.getInt("count")+1);
        // your logics
        log.info(name + "\tDemo Job执行时间: " + LocalDateTime.now());
    }
}
